﻿using Cls_BoticasySaludBE;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using BL = Cls_BoticasySaludBL;

namespace WcfServicioComunicacionByS
{
    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "RestServiceImpl" in code, svc and config file together.
    // NOTE: In order to launch WCF Test Client for testing this service, please select RestServiceImpl.svc or RestServiceImpl.svc.cs at the Solution Explorer and start debugging.
    public class RestServiceImpl : IRestServiceImpl
    {
        #region IRestServices Members
        public string XMLData(string id) 
        {
            return "XML : You Requested  Product : " + id; 
        }

        public string JSONData(string id)
        {
            return "JSON : You Requested  Product : " + id;
        }

        //public string InsertPedido(Pedido pedido)
        public bool InsertPedido(Pedido pedido)
        {
            bool Estado = true;
            BL.PedidoBL ObjetoNegocio = new BL.PedidoBL();
            CabPedido CabeceraPed = new CabPedido();
            CabeceraPed.idCliente = pedido.cabecera.idCliente;
            CabeceraPed.Nombre = pedido.cabecera.Nombre;
            CabeceraPed.Dni = pedido.cabecera.Dni;
            CabeceraPed.Direccion = pedido.cabecera.Direccion;
            CabeceraPed.Telefono = pedido.cabecera.Telefono;
            CabeceraPed.MontoTotal = pedido.cabecera.MontoTotal;
            CabeceraPed.Longitud = pedido.cabecera.Longitud;
            CabeceraPed.Latitud = pedido.cabecera.Latitud;
            CabeceraPed.TipoPago = pedido.cabecera.TipoPago;
            CabeceraPed.TipoTarjeta = pedido.cabecera.TipoTarjeta;

            int CodigoCabPedido = ObjetoNegocio.InsertCabPedidoBL(CabeceraPed);
            if (CodigoCabPedido <= 0)
            {
                Estado = false;
            }
            else
            {
                for (int i = 0; i < pedido.detalle.Count; i++)
                {
                    DetPedido DetallePed = new DetPedido();
                    DetallePed.ProductoItem = pedido.detalle[i].ProductoItem;
                    DetallePed.Cantidad = pedido.detalle[i].Cantidad;
                    DetallePed.Precio = pedido.detalle[i].Precio;
                    DetallePed.SubTotal = pedido.detalle[i].Cantidad * pedido.detalle[i].Precio ;
                    int CodDetPedido = ObjetoNegocio.InsertDetPedidoBL(DetallePed,CodigoCabPedido);
                    if (CodDetPedido <= 0)
                    {
                        Estado = false;
                    }
                }
            }
            return Estado;
        }

        public bool EnviarUbicacionMotorizado(double latitud, double longitud)
        {

            //OBTENER EL VALOR DEL CAMPO idGCM CON EL USUARIO Q RECIBE DE PARAMETRO

            //Obtener este valor de la tabla cliente x el usuario del parametro - campo: idGCM
            string regId = "APA91bFv4mCbGA-2VyXNu_IRYP7PdrMkfQmmfw1RroSrjB0Z0-ZnEbA8hJnSk-fFbbkIVDgNDyF4kThzjZ23d58Za0SvXcRoJcLP5Ej5TIg5x1kR0TCsNV6VW8TPYxjfZbt14eDpHZAtdWgZX2fPmtQ8zPZJ2W1dSg";

            string collapseKey = DateTime.Now.ToString();

            int operacion = 3;

            string toSend = String.Format("registration_id={0}&collapse_key={1}&data.operacion={2}&data.latitud={3}&data.longitud={4}", regId, collapseKey, operacion, latitud, longitud);

            return EnviarGCM(toSend);
        }

        public bool EnviarMsg(string msg)
        {

            //OBTENER EL VALOR DEL CAMPO idGCM CON EL USUARIO Q RECIBE DE PARAMETRO

            //Obtener este valor de la tabla cliente x el usuario del parametro - campo: idGCM
            string regId = "APA91bFv4mCbGA-2VyXNu_IRYP7PdrMkfQmmfw1RroSrjB0Z0-ZnEbA8hJnSk-fFbbkIVDgNDyF4kThzjZ23d58Za0SvXcRoJcLP5Ej5TIg5x1kR0TCsNV6VW8TPYxjfZbt14eDpHZAtdWgZX2fPmtQ8zPZJ2W1dSg";

            string collapseKey = DateTime.Now.ToString();

            int operacion = 2;

            string toSend = String.Format("registration_id={0}&collapse_key={1}&data.operacion={2}&data.msg={3}", regId, collapseKey, operacion, msg);

            return EnviarGCM(toSend);

        }

        private bool EnviarGCM(string toSend)
        {
            String GCM_URL = @"https://android.googleapis.com/gcm/send";

            bool flag = false;

            HttpWebRequest req = (HttpWebRequest)WebRequest.Create(GCM_URL);
            req.Method = "POST";
            req.ContentLength = toSend.Length;
            req.ContentType = "application/x-www-form-urlencoded";

            string apiKey = "AIzaSyAiLUihtBpa3iWnQoC440GrFRSsRJUVBlo";
            req.Headers.Add("Authorization:key=" + apiKey);

            using (StreamWriter oWriter = new StreamWriter(req.GetRequestStream()))
            {
                oWriter.Write(toSend);
            }

            using (HttpWebResponse resp = (HttpWebResponse)req.GetResponse())
            {
                using (StreamReader sr = new StreamReader(resp.GetResponseStream()))
                {
                    string respData = sr.ReadToEnd();

                    if (resp.StatusCode == HttpStatusCode.OK)   // OK = 200
                    {
                        if (respData.StartsWith("id="))
                            flag = true;
                    }
                    else if (resp.StatusCode == HttpStatusCode.InternalServerError)    // 500
                        Console.WriteLine("Error interno del servidor, prueba más tarde.");
                    else if (resp.StatusCode == HttpStatusCode.ServiceUnavailable)    // 503
                        Console.WriteLine("Servidor no disponible temporalmente, prueba más tarde.");
                    else if (resp.StatusCode == HttpStatusCode.Unauthorized)          // 401
                        Console.WriteLine("La API Key utilizada no es válida.");
                    else
                        Console.WriteLine("Error: " + resp.StatusCode);
                }
            }

            return flag;
        }

        //public bool InsertarPedido(Pedido data)
        //{
        //    bool Estado = true;
        //    BL.PedidoBL ObjetoNegocio = new BL.PedidoBL();
        //    CabPedido CabeceraPed = new CabPedido();
        //    CabeceraPed.CodigoCliente = data.CodigoCliente;
        //    CabeceraPed.MontoTotal = data.MontoTotal;
        //    CabeceraPed.Direccion = data.Direccion;
        //    CabeceraPed.Altitud = data.Altitud;
        //    CabeceraPed.Latitud = data.Latitud;
        //    int CodigoCabPedido = ObjetoNegocio.InsertCabPedidoBL(CabeceraPed);
        //    if (CodigoCabPedido <= 0)
        //    {
        //        Estado = false;
        //    }
        //    else
        //    {
        //        //for (int i = 0; i < data.Count; i++)
        //        //{
        //            DetPedido DetallePed = new DetPedido();
        //            DetallePed.CodigoCabPedido = CodigoCabPedido;
        //            DetallePed.CodigoProducto = data.CodigoProducto;
        //            DetallePed.Cantidad = data.Cantidad;
        //            DetallePed.Subtotal = data.Subtotal;
        //            int CodDetPedido = ObjetoNegocio.InsertDetPedidoBL(DetallePed);
        //            if (CodDetPedido <= 0)
        //            {
        //                Estado = false;
        //            }
        //        //}
        //    }
        //    return Estado;
        //}

        #endregion
    }
}
